# 1、有这样的一个列表，深度不可知，列表里面还会嵌套列表，
# 我想要把这个列表从左到右拼接成一个新的列表，且顺序不变
# 举例：[12,33,[11,22,33,[55,66,99]],[55,66]]
# 变成：[12, 33, 11, 22, 33, 55, 66, 99, 55, 66]
list1 = [12,33,[11,22,33,[55,66,99]],[55,66]]
"""def new_list(list1:list)->list:
    list2 = []
    for i in list1:
        if isinstance(i,list):
            list2.extend(new_list(i))
        else:
            list2.append(i)
    return list2
print(new_list(list1))"""


# 2、编写装饰器，为多个函数加上认证的功能（用户的账号密码）
#  要求登录成功一次，后续的函数都无需输入用户名和密码
result = False # 定义全局变量，算作标记一下，看登录是否是成功的
def login(func):
    def luoji(*args,**kwargs): # 为了适配所有函数，加了*args不定长参数和**kwargs不定长关键字参数
        global result # 引用全局变量
        if result: # 如果说result为True的话
            print("免登录！") # 后续不用再输入用户名和密码
            func(*args,**kwargs) # 调用被装饰的函数
        else:
            username = input("请输入用户名")  # 输入用户名
            password = input("请输入密码")  # 输入密码
            if username == "admin" and password == "123456" :
                print("登录成功")
                func(*args,**kwargs) # 调用被装饰的函数
                result = True # 修改全局的标记为True，下次调用就可以免登录了
            else:
                print("登录失败！") # 登陆失败
                # 不会调用函数
    return luoji
@login
def shopping(sgood):
    print(f"去购物，买{sgood}东西！")
@login
def eating(fo):
    print(f"去吃{fo}东西啦!")
# shopping("啦啦啦")
# eating("好健康")
"""
装饰器公式：
def aa(func): # func被修饰的方法名称，是一个形参
    def bb(*args,**kwargs): # *args,**kwargs被装饰方法的形参
        ....
        func(*args,**kwargs)
        ...
    return bb
"""
def hello(func):
    def ll(*args,**kwargs):
        print("大家好")
        func(*args,**kwargs)
        print("自我介绍完毕")
    return ll
@hello
def info(name,age,address,phone_number):
    print(f"{name}正在学习中，今年{age}岁，来自：{address},我的手机号码是：{phone_number}")
# info("好健康",65,"辽宁省沈阳市","1594822213")
"""
print("大家好")
func(*args,**kwargs)  ----> print(f"{name}正在学习中，今年{age}岁，来自：{address},我的手机号码是：{phone_number}")
print("自我介绍完毕")
"""

"""def aa(func):
    def bb(*args,**kwargs):
        print(...)
        func(*args,**kwargs)
        print(...)
    return bb
@aa
def info1():
    pass"""
"""
print(...)
func(*args,**kwargs)
print(...)
"""

# 3、请实现一个装饰器，把函数的返回值+100然后返回
def add_num(func):
    def luoji(num):
        print(f'原来的num值是：{num}')
        num+=100
        func(num)
        return num
    return luoji
@add_num
def num(num):
    print(f"+100以后的num值是：{num}")
# print(num(1))
"""
print(f'原来的num值是：{num}')
num+=100
func(num)  --- > print(f"+100以后的num值是：{num}")
num()函数的返回值是：return num  ，+100以后值
"""


# 4、请实现一个装饰器，通过一次调用使函数重复执行5次
def cc(func): #
    def ff(*args,**kwargs):
        for i in range(5): # 循环控制次数
            func(*args,**kwargs) # 每次都去调用被装饰的函数
    return ff
@cc
def info2():
    print("从前有座山")
    print("从前有座1")
    print("从前有座2")
    print("从前有座3")
info2()

# 5、输入任意个字符串,分别实现从小到大输出和从大到小输出
"""s = input("请输入字符串内容")
d = sorted(s,reverse=True) # 从大到小输出
x = sorted(s,reverse=False) # 从小到大输出
print(f"原来的字符串为：{s}，从大到小输出：{d}")
print(f"原来的字符串为：{s}，从小到大输出：{x}")"""
def str1(func):
    def ff(*args,**kwagrs):
        func(*args, **kwagrs)
        list1 = [int(i) for i in args]
        d_list1 = sorted(list1, reverse=True)  # 从大到小输出
        d_list2 = sorted(list1, reverse=False)  # 从小到大输出
        return f"从大到小输出为：{d_list1}\n从小到大输出为：{d_list2}"
    return ff
@str1
def oo(*args):
    print(f"原始输入内容为：{[i for i in args]}")
print(oo('3','123','1235','432','999'))

# 6、接收n个数字，求这些参数数字的和
def numadd(*n):
    sum = 0
    for i in n:
        sum +=i
    return sum
# 7、编写一个函数，实现数字的自增（从0开始，每调用一次，数字+1）
def num_add():
    num = 0
    def add():
        nonlocal num
        num+=1
        return num
    return add

n = num_add()
print(n()) # 1
print(n()) # 2
print(n()) # 3
print(n()) # 4
print(n()) # 5

